/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sico.datos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import sico.modelo.EntidadContrato;
import sico.modelo.EntidadEmpleado;
import sico.modelo.IEntidad;

/**
 *
 * @author John Carlos Arrieta
 */
public class DAOEntidadContrato extends ManejadorBaseDatos implements IDAOPersistencia{
      private EntidadContrato contrato;
      private EntidadEmpleado empleado;

	public int insertar( IEntidad objeto)  throws Exception {
		int filas = 0;
		EntidadContrato contrato = (EntidadContrato) objeto;
                conectar();
		Connection con = getConexion();
		String sentenciaSQL = "INSERT INTO Contratos VALUES ( ?, ?, ?, ?, ?, ?)";
                PreparedStatement sentencia = crearSentencia( sentenciaSQL );
                sentencia.setString(1, contrato.getCodigo());
                sentencia.setDate(2, new java.sql.Date(contrato.getInicio().getTime()));
                sentencia.setDate(3, new java.sql.Date(contrato.getFin().getTime()));
                sentencia.setString(4, contrato.getTipo());
                sentencia.setInt(5, contrato.getSalarioInicial());
                sentencia.setString(6, contrato.getEmpleado().getCodigo());
                filas = actualizar(sentencia);
		desconectar(  );
		return filas;
	}

    public DAOEntidadContrato(String driver, String servidor, String url, String usuarioBD, String passwordUsuarioBD, String nombreBD) throws Exception {
        super(driver, servidor, url, usuarioBD, passwordUsuarioBD, nombreBD);
    }

    public DAOEntidadContrato() throws Exception {
        super();
    }

// modificar( condicion )

// borrar( condicion )

// consultar( codigo )

    public ArrayList<IEntidad> listar( String condicion ) throws Exception {
            ArrayList<IEntidad> listaContratos = new ArrayList<IEntidad>();
            EntidadEmpleado empleado = null;
            Connection con = getConexion();
            String sentenciaSQL = "SELECT emp.*, cont.* FROM Empleados emp, Contratos cont" +
                                    (condicion == null || condicion.length()== 0 ? "":"WHERE " + condicion + " AND cont.codigo = emp.contrato") +
                                    " ORDER BY Incio ";
            PreparedStatement sentencia = crearSentencia( sentenciaSQL );
            ResultSet filasConsulta = consultar(sentencia);
            while (filasConsulta .next()) {
                  empleado = new EntidadEmpleado( filasConsulta.getString("emp.codigo"),
                                                  filasConsulta.getString("emp.nombre"),
                                          filasConsulta.getString( "emp.cargo" ),
                                                  filasConsulta.getInt( "emp.Salario" ),
                                           null // el contrato que despues se le pasara
                                           );
                   EntidadContrato  contrato = new EntidadContrato( new Date(filasConsulta.getDate("cont.inicio").getTime()),  new Date(filasConsulta.getDate("cont.inicio").getTime()),  filasConsulta.getInt("cont.salario_inicio"), filasConsulta.getString("cont.tipo"),filasConsulta.getString("cont.codigo"));
                   empleado.setContrato(contrato);
                   contrato.setEmpleado(empleado);
                listaContratos.add( empleado );
            }
            desconectar( );
            return listaContratos ;

    }

   

   public int borrar(String condicion) throws Exception {
            int filas = 0;
            EntidadContrato contratoAborrar = (EntidadContrato) buscar(condicion, false); // si es false solo se consulta el codigo del empleado
            String sentenciaSQL = "DELETE FROM  Contratos   WHERE codigo=" + contratoAborrar.getCodigo();
            conectar();
            PreparedStatement sentencia = crearSentencia( sentenciaSQL );
            actualizar(sentencia);
            desconectar(  );
            empleado = (EntidadEmpleado)contratoAborrar.getEmpleado();
            return filas;
    }
   public int borrar(String condicion, boolean conSuEmpleado) throws Exception {
           int filas = 0;
            borrar(condicion);
            if(conSuEmpleado){
                DAOEntidadEmpleado daoEmpleado = new DAOEntidadEmpleado();
                filas = daoEmpleado.borrar(empleado.getCodigo());
            }
            return filas;
    }


  public IEntidad buscar(String codigo, boolean conSuEmpleado) throws Exception {
         if(codigo == null || codigo.isEmpty()){
            throw new Exception ("El Contrato que desea Consultar no se encuentra en el Sistema");
        }
         String sentenciaSQL = null;
         if ( conSuEmpleado) {
                return  (EntidadContrato) buscar(codigo);
         }
         else{
             sentenciaSQL = "SELECT * FROM  Contratos cont  WHERE cont.codigo=" + codigo ;
             Connection con = getConexion();
             PreparedStatement senetencia = crearSentencia(sentenciaSQL);
             ResultSet filaResultado = consultar(senetencia);
             if (filaResultado.next()) {
                EntidadContrato contratoEncontrado = new EntidadContrato();
                contratoEncontrado.setCodigo(filaResultado.getString("cont.codigo"));
                contratoEncontrado.setInicio(new Date(filaResultado.getDate("cont.inicio").getTime()));
                contratoEncontrado.setFin(new Date(filaResultado.getDate("cont.fin").getTime()));
                contratoEncontrado.setTipo(filaResultado.getString("cont.tipo"));
                contratoEncontrado.setSalarioInicial(filaResultado.getInt("cont.salario_inicio"));
                EntidadEmpleado empleado = new EntidadEmpleado();
                empleado.setCodigo(filaResultado.getString("cont.empleado"));
                contratoEncontrado.setEmpleado(empleado);
                empleado.setContrato(contratoEncontrado);
                desconectar();
               return contratoEncontrado;
            }else{
                    desconectar();
                    throw new Exception("El Contrato con codigo="+codigo+" no se encuentra en el Sistema");
            }
         }
  }

  public IEntidad buscar(String codigo) throws Exception {
         if(codigo == null || codigo.isEmpty()){
            throw new Exception ("El Contrato que desea Consultar no se encuentra en el Sistema");
        }

         String sentenciaSQL = "SELECT emp.*, cont.* FROM  Empleados emp, Contratos cont WHERE cont.codigo=" + codigo+" AND cont.empleado = emp.codigo" ;
         Connection con = getConexion();
         PreparedStatement senetencia = crearSentencia(sentenciaSQL);
         ResultSet filaResultado = consultar(senetencia);
         if (filaResultado.next()) {
            EntidadContrato contratoEncontrado = new EntidadContrato();
            contratoEncontrado.setCodigo(filaResultado.getString("cont.codigo"));
            contratoEncontrado.setInicio(new Date(filaResultado.getDate("cont.inicio").getTime()));
            contratoEncontrado.setFin(new Date(filaResultado.getDate("cont.fin").getTime()));
            contratoEncontrado.setTipo(filaResultado.getString("cont.tipo"));
            contratoEncontrado.setSalarioInicial(filaResultado.getInt("cont.salario_inicio"));
            EntidadEmpleado empleado = new EntidadEmpleado();
            empleado.setCodigo(filaResultado.getString("emp.codigo"));
            empleado.setNombre(filaResultado.getString("emp.nombre"));
            empleado.setCargo(filaResultado.getString("emp.cargo"));
            empleado.setSalario(filaResultado.getInt("emp.salario"));
            contratoEncontrado.setEmpleado(empleado);
            empleado.setContrato(contratoEncontrado);
            desconectar();
            return contratoEncontrado;
         }
         else{
             desconectar();
             throw new Exception("El Contrato con codigo="+codigo+" no se encuentra en el Sistema");
         }
    }
    public int modificar(IEntidad objeto, String condicion) throws Exception {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
